//////////////////////////////////////////////////////////////////////////////////
//                                                                              //
//  This file is part of the buola project (https://code.google.com/p/buola/).  //
//                                                                              //
//  Copyright(c) 2007-2012 Xavi Gratal                                          //
//  gratal AT gmail DOT com                                                     //
//                                                                              //
//  Buola is free software: you can redistribute it and/or modify               //
//  it under the terms of the GNU General Public License as published by        //
//  the Free Software Foundation, either version 3 of the License, or           //
//  (at your option) any later version.                                         //
//                                                                              //
//  Buola is distributed in the hope that it will be useful,                    //
//  but WITHOUT ANY WARRANTY; without even the implied warranty of              //
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               //
//  GNU General Public License for more details.                                //
//                                                                              //
//  You should have received a copy of the GNU General Public License           //
//  along with buola.  If not, see <http://www.gnu.org/licenses/>.              //
//                                                                              //
//////////////////////////////////////////////////////////////////////////////////

#include "general.h"

CSQLiteDBImpl::CSQLiteDBImpl()
{
    mConnection=nullptr;
}

void CSQLiteDBImpl::Connect()
{
    int lRC=sqlite3_open(mURI.Path().c_str(),&mConnection);
    if(lRC)
    {
        throw XConnection("can't connect to sqlite database ("+
                mURI.Path()+")");
    }

    mConnected=true;
}

void CSQLiteDBImpl::Disconnect()
{
    if(!mConnected) return;

    sqlite3_close(mConnection);
    mConnected=false;
}

void CSQLiteDBImpl::Exec(const std::string &pQuery)
{
    char *lError;
    int lRC=sqlite3_exec(mConnection,pQuery.c_str(),nullptr,nullptr,&lError);

    if(lRC!=SQLITE_OK)
    {
        throw XSQLQueryFailed(lError,lRC);
    }
}

detail::CDBQueryImpl *CSQLiteDBImpl::GetNewQueryImpl()
{
    return new CSQLiteQueryImpl(this);
}

int64_t CSQLiteDBImpl::GetLastInsertID()
{
    return sqlite3_last_insert_rowid(mConnection);
}
